﻿using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework.Graphics;

namespace Terraria.ModLoader
{
	// Token: 0x0200018B RID: 395
	public static class EquipLoader
	{
		// Token: 0x06000F81 RID: 3969 RVA: 0x0040391C File Offset: 0x00401B1C
		static EquipLoader()
		{
			foreach (EquipType equipType in EquipLoader.EquipTypes)
			{
				EquipLoader.nextEquip[equipType] = EquipLoader.GetNumVanilla(equipType);
				EquipLoader.equipTextures[equipType] = new Dictionary<int, EquipTexture>();
			}
			EquipLoader.slotToId[EquipType.Head] = new Dictionary<int, int>();
			EquipLoader.slotToId[EquipType.Body] = new Dictionary<int, int>();
			EquipLoader.slotToId[EquipType.Legs] = new Dictionary<int, int>();
		}

		// Token: 0x06000F82 RID: 3970 RVA: 0x004039E8 File Offset: 0x00401BE8
		internal static int ReserveEquipID(EquipType type)
		{
			int result = EquipLoader.nextEquip[type];
			IDictionary<EquipType, int> dictionary = EquipLoader.nextEquip;
			int num = dictionary[type];
			dictionary[type] = num + 1;
			return result;
		}

		// Token: 0x06000F83 RID: 3971 RVA: 0x00403A1C File Offset: 0x00401C1C
		public static EquipTexture GetEquipTexture(EquipType type, int slot)
		{
			EquipTexture result;
			if (!EquipLoader.equipTextures[type].TryGetValue(slot, out result))
			{
				return null;
			}
			return result;
		}

		// Token: 0x06000F84 RID: 3972 RVA: 0x00403A44 File Offset: 0x00401C44
		internal static void ResizeAndFillArrays()
		{
			Array.Resize<bool>(ref Main.armorHeadLoaded, EquipLoader.nextEquip[EquipType.Head]);
			Array.Resize<bool>(ref Main.armorBodyLoaded, EquipLoader.nextEquip[EquipType.Body]);
			Array.Resize<bool>(ref Main.armorLegsLoaded, EquipLoader.nextEquip[EquipType.Legs]);
			Array.Resize<bool>(ref Main.accHandsOnLoaded, EquipLoader.nextEquip[EquipType.HandsOn]);
			Array.Resize<bool>(ref Main.accHandsOffLoaded, EquipLoader.nextEquip[EquipType.HandsOff]);
			Array.Resize<bool>(ref Main.accBackLoaded, EquipLoader.nextEquip[EquipType.Back]);
			Array.Resize<bool>(ref Main.accFrontLoaded, EquipLoader.nextEquip[EquipType.Front]);
			Array.Resize<bool>(ref Main.accShoesLoaded, EquipLoader.nextEquip[EquipType.Shoes]);
			Array.Resize<bool>(ref Main.accWaistLoaded, EquipLoader.nextEquip[EquipType.Waist]);
			Array.Resize<bool>(ref Main.wingsLoaded, EquipLoader.nextEquip[EquipType.Wings]);
			Array.Resize<bool>(ref Main.accShieldLoaded, EquipLoader.nextEquip[EquipType.Shield]);
			Array.Resize<bool>(ref Main.accNeckLoaded, EquipLoader.nextEquip[EquipType.Neck]);
			Array.Resize<bool>(ref Main.accFaceLoaded, EquipLoader.nextEquip[EquipType.Face]);
			Array.Resize<bool>(ref Main.accballoonLoaded, EquipLoader.nextEquip[EquipType.Balloon]);
			foreach (EquipType equipType in EquipLoader.EquipTypes)
			{
				for (int j = EquipLoader.GetNumVanilla(equipType); j < EquipLoader.nextEquip[equipType]; j++)
				{
					EquipLoader.GetLoadedArray(equipType)[j] = true;
				}
			}
			Array.Resize<Texture2D>(ref Main.armorHeadTexture, EquipLoader.nextEquip[EquipType.Head]);
			Array.Resize<Texture2D>(ref Main.armorBodyTexture, EquipLoader.nextEquip[EquipType.Body]);
			Array.Resize<Texture2D>(ref Main.femaleBodyTexture, EquipLoader.nextEquip[EquipType.Body]);
			Array.Resize<Texture2D>(ref Main.armorArmTexture, EquipLoader.nextEquip[EquipType.Body]);
			Array.Resize<Texture2D>(ref Main.armorLegTexture, EquipLoader.nextEquip[EquipType.Legs]);
			Array.Resize<Texture2D>(ref Main.accHandsOnTexture, EquipLoader.nextEquip[EquipType.HandsOn]);
			Array.Resize<Texture2D>(ref Main.accHandsOffTexture, EquipLoader.nextEquip[EquipType.HandsOff]);
			Array.Resize<Texture2D>(ref Main.accBackTexture, EquipLoader.nextEquip[EquipType.Back]);
			Array.Resize<Texture2D>(ref Main.accFrontTexture, EquipLoader.nextEquip[EquipType.Front]);
			Array.Resize<Texture2D>(ref Main.accShoesTexture, EquipLoader.nextEquip[EquipType.Shoes]);
			Array.Resize<Texture2D>(ref Main.accWaistTexture, EquipLoader.nextEquip[EquipType.Waist]);
			Array.Resize<Texture2D>(ref Main.wingsTexture, EquipLoader.nextEquip[EquipType.Wings]);
			Array.Resize<Texture2D>(ref Main.accShieldTexture, EquipLoader.nextEquip[EquipType.Shield]);
			Array.Resize<Texture2D>(ref Main.accNeckTexture, EquipLoader.nextEquip[EquipType.Neck]);
			Array.Resize<Texture2D>(ref Main.accFaceTexture, EquipLoader.nextEquip[EquipType.Face]);
			Array.Resize<Texture2D>(ref Main.accBalloonTexture, EquipLoader.nextEquip[EquipType.Balloon]);
			foreach (EquipType equipType2 in EquipLoader.EquipTypes)
			{
				foreach (KeyValuePair<int, EquipTexture> keyValuePair in EquipLoader.equipTextures[equipType2])
				{
					int key = keyValuePair.Key;
					EquipTexture value = keyValuePair.Value;
					EquipLoader.GetTextureArray(equipType2)[key] = ModLoader.GetTexture(value.Texture);
					if (equipType2 == EquipType.Body)
					{
						Main.femaleBodyTexture[key] = ModLoader.GetTexture(EquipLoader.femaleTextures[key]);
						Main.armorArmTexture[key] = ModLoader.GetTexture(EquipLoader.armTextures[key]);
					}
				}
			}
			Array.Resize<int>(ref Item.headType, EquipLoader.nextEquip[EquipType.Head]);
			foreach (KeyValuePair<int, int> keyValuePair2 in EquipLoader.slotToId[EquipType.Head])
			{
				Item.headType[keyValuePair2.Key] = keyValuePair2.Value;
			}
			Array.Resize<int>(ref Item.bodyType, EquipLoader.nextEquip[EquipType.Body]);
			foreach (KeyValuePair<int, int> keyValuePair3 in EquipLoader.slotToId[EquipType.Body])
			{
				Item.bodyType[keyValuePair3.Key] = keyValuePair3.Value;
			}
			Array.Resize<int>(ref Item.legType, EquipLoader.nextEquip[EquipType.Legs]);
			foreach (KeyValuePair<int, int> keyValuePair4 in EquipLoader.slotToId[EquipType.Legs])
			{
				Item.legType[keyValuePair4.Key] = keyValuePair4.Value;
			}
		}

		// Token: 0x06000F85 RID: 3973 RVA: 0x00403F14 File Offset: 0x00402114
		internal static void Unload()
		{
			foreach (EquipType equipType in EquipLoader.EquipTypes)
			{
				EquipLoader.nextEquip[equipType] = EquipLoader.GetNumVanilla(equipType);
				EquipLoader.equipTextures[equipType].Clear();
			}
			EquipLoader.idToSlot.Clear();
			EquipLoader.slotToId[EquipType.Head].Clear();
			EquipLoader.slotToId[EquipType.Body].Clear();
			EquipLoader.slotToId[EquipType.Legs].Clear();
			EquipLoader.femaleTextures.Clear();
			EquipLoader.armTextures.Clear();
		}

		// Token: 0x06000F86 RID: 3974 RVA: 0x00403FA8 File Offset: 0x004021A8
		internal static int GetNumVanilla(EquipType type)
		{
			switch (type)
			{
			case EquipType.Head:
				return 216;
			case EquipType.Body:
				return 210;
			case EquipType.Legs:
				return 161;
			case EquipType.HandsOn:
				return 20;
			case EquipType.HandsOff:
				return 12;
			case EquipType.Back:
				return 14;
			case EquipType.Front:
				return 5;
			case EquipType.Shoes:
				return 18;
			case EquipType.Waist:
				return 13;
			case EquipType.Wings:
				return 40;
			case EquipType.Shield:
				return 7;
			case EquipType.Neck:
				return 10;
			case EquipType.Face:
				return 9;
			case EquipType.Balloon:
				return 18;
			default:
				return 0;
			}
		}

		// Token: 0x06000F87 RID: 3975 RVA: 0x00404028 File Offset: 0x00402228
		internal static bool[] GetLoadedArray(EquipType type)
		{
			switch (type)
			{
			case EquipType.Head:
				return Main.armorHeadLoaded;
			case EquipType.Body:
				return Main.armorBodyLoaded;
			case EquipType.Legs:
				return Main.armorLegsLoaded;
			case EquipType.HandsOn:
				return Main.accHandsOnLoaded;
			case EquipType.HandsOff:
				return Main.accHandsOffLoaded;
			case EquipType.Back:
				return Main.accBackLoaded;
			case EquipType.Front:
				return Main.accFrontLoaded;
			case EquipType.Shoes:
				return Main.accShoesLoaded;
			case EquipType.Waist:
				return Main.accWaistLoaded;
			case EquipType.Wings:
				return Main.wingsLoaded;
			case EquipType.Shield:
				return Main.accShieldLoaded;
			case EquipType.Neck:
				return Main.accNeckLoaded;
			case EquipType.Face:
				return Main.accFaceLoaded;
			case EquipType.Balloon:
				return Main.accballoonLoaded;
			default:
				return null;
			}
		}

		// Token: 0x06000F88 RID: 3976 RVA: 0x004040CC File Offset: 0x004022CC
		internal static Texture2D[] GetTextureArray(EquipType type)
		{
			switch (type)
			{
			case EquipType.Head:
				return Main.armorHeadTexture;
			case EquipType.Body:
				return Main.armorBodyTexture;
			case EquipType.Legs:
				return Main.armorLegTexture;
			case EquipType.HandsOn:
				return Main.accHandsOnTexture;
			case EquipType.HandsOff:
				return Main.accHandsOffTexture;
			case EquipType.Back:
				return Main.accBackTexture;
			case EquipType.Front:
				return Main.accFrontTexture;
			case EquipType.Shoes:
				return Main.accShoesTexture;
			case EquipType.Waist:
				return Main.accWaistTexture;
			case EquipType.Wings:
				return Main.wingsTexture;
			case EquipType.Shield:
				return Main.accShieldTexture;
			case EquipType.Neck:
				return Main.accNeckTexture;
			case EquipType.Face:
				return Main.accFaceTexture;
			case EquipType.Balloon:
				return Main.accBalloonTexture;
			default:
				return null;
			}
		}

		// Token: 0x06000F89 RID: 3977 RVA: 0x00404170 File Offset: 0x00402370
		internal static void SetSlot(Item item)
		{
			IDictionary<EquipType, int> dictionary;
			if (!EquipLoader.idToSlot.TryGetValue(item.type, out dictionary))
			{
				return;
			}
			foreach (KeyValuePair<EquipType, int> keyValuePair in dictionary)
			{
				int value = keyValuePair.Value;
				switch (keyValuePair.Key)
				{
				case EquipType.Head:
					item.headSlot = value;
					break;
				case EquipType.Body:
					item.bodySlot = value;
					break;
				case EquipType.Legs:
					item.legSlot = value;
					break;
				case EquipType.HandsOn:
					item.handOnSlot = (sbyte)value;
					break;
				case EquipType.HandsOff:
					item.handOffSlot = (sbyte)value;
					break;
				case EquipType.Back:
					item.backSlot = (sbyte)value;
					break;
				case EquipType.Front:
					item.frontSlot = (sbyte)value;
					break;
				case EquipType.Shoes:
					item.shoeSlot = (sbyte)value;
					break;
				case EquipType.Waist:
					item.waistSlot = (sbyte)value;
					break;
				case EquipType.Wings:
					item.wingSlot = (sbyte)value;
					break;
				case EquipType.Shield:
					item.shieldSlot = (sbyte)value;
					break;
				case EquipType.Neck:
					item.neckSlot = (sbyte)value;
					break;
				case EquipType.Face:
					item.faceSlot = (sbyte)value;
					break;
				case EquipType.Balloon:
					item.balloonSlot = (sbyte)value;
					break;
				}
			}
		}

		// Token: 0x06000F8A RID: 3978 RVA: 0x004042A8 File Offset: 0x004024A8
		internal static int GetPlayerEquip(Player player, EquipType type)
		{
			switch (type)
			{
			case EquipType.Head:
				return player.head;
			case EquipType.Body:
				return player.body;
			case EquipType.Legs:
				return player.legs;
			case EquipType.HandsOn:
				return (int)player.handon;
			case EquipType.HandsOff:
				return (int)player.handoff;
			case EquipType.Back:
				return (int)player.back;
			case EquipType.Front:
				return (int)player.front;
			case EquipType.Shoes:
				return (int)player.shoe;
			case EquipType.Waist:
				return (int)player.waist;
			case EquipType.Wings:
				return player.wings;
			case EquipType.Shield:
				return (int)player.shield;
			case EquipType.Neck:
				return (int)player.neck;
			case EquipType.Face:
				return (int)player.face;
			case EquipType.Balloon:
				return (int)player.balloon;
			default:
				return 0;
			}
		}

		// Token: 0x04001328 RID: 4904
		private static readonly IDictionary<EquipType, int> nextEquip = new Dictionary<EquipType, int>();

		// Token: 0x04001329 RID: 4905
		internal static readonly IDictionary<EquipType, IDictionary<int, EquipTexture>> equipTextures = new Dictionary<EquipType, IDictionary<int, EquipTexture>>();

		// Token: 0x0400132A RID: 4906
		internal static readonly IDictionary<int, IDictionary<EquipType, int>> idToSlot = new Dictionary<int, IDictionary<EquipType, int>>();

		// Token: 0x0400132B RID: 4907
		internal static readonly IDictionary<EquipType, IDictionary<int, int>> slotToId = new Dictionary<EquipType, IDictionary<int, int>>();

		// Token: 0x0400132C RID: 4908
		internal static readonly IDictionary<int, string> femaleTextures = new Dictionary<int, string>();

		// Token: 0x0400132D RID: 4909
		internal static readonly IDictionary<int, string> armTextures = new Dictionary<int, string>();

		// Token: 0x0400132E RID: 4910
		public static readonly EquipType[] EquipTypes = (EquipType[])Enum.GetValues(typeof(EquipType));
	}
}
